﻿#region Using Declaration

using System.Collections.Generic;
using System.ComponentModel;

#endregion Using Declaration

namespace T4_Eind_programma
{
    public class Mengbatch : INotifyPropertyChanged
    {
        #region Variable Declaration

        private List<Doeltank> doeltank;
        private bool handmatig;
        private int aantalVaten;
        private bool klaar;
        private int mengtijd;
        private int nummer;
        private string productcode;
        private int siroopPercentage;
        private Smaak smaak;
        private string status;
        private bool verwarmen;
        private int verwarmTijd;
        private BindingList<Vulbatch> vulbatchList = new BindingList<Vulbatch>();

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion Variable Declaration

        #region Properties

        public List<Doeltank> Doeltank
        {
            get { return doeltank; }
            set { SetField(ref doeltank, value, "Doeltank"); }
        }

        public bool Handmatig
        {
            get { return handmatig; }
            set
            {
                SetField(ref handmatig, value, "Handmatig");
            }
        }

        public int Hoeveelheid
        {
            get { return aantalVaten; }
            set
            {
                SetField(ref aantalVaten, value, "Hoeveelheid");
            }
        }

        public bool Klaar
        {
            get { return klaar; }
            set
            {
                SetField(ref klaar, value, "Klaar");
            }
        }

        public int Mengtijd
        {
            get { return mengtijd; }
            set { mengtijd = value; }
        }

        public int Nummer
        {
            get { return nummer; }
            set { nummer = value; }
        }

        public string Productcode
        {
            get { return productcode; }
            set
            {
                SetField(ref productcode, value, "Productcode");
            }
        }

        public int SiroopPercentage
        {
            get { return siroopPercentage; }
            set
            {
                SetField(ref siroopPercentage, value, "SiroopPercentage");
            }
        }

        public Smaak Smaak
        {
            get { return smaak; }
            set
            {
                SetField(ref smaak, value, "Smaak");
            }
        }

        public string Status
        {
            get { return status; }
            set { SetField(ref status, value, "Status"); }
        }

        public bool Verwarmen
        {
            get { return verwarmen; }
            set
            {
                SetField(ref verwarmen, value, "Verwarmen");
            }
        }

        public int VerwarmTijd
        {
            get { return verwarmTijd; }
            set
            {
                verwarmTijd = value;
            }
        }

        public BindingList<Vulbatch> VulbatchList
        {
            get { return vulbatchList; }
            set
            {
                SetField(ref vulbatchList, value, "VulbatchList");
            }
        }

        #endregion Properties

        #region Constructors

        public Mengbatch(int nummer, string productcode, Smaak smaak, int hoeveelheid, int siroopPercentage,
            int mengtijd, bool verwarmen, bool handmatig, List<Doeltank> doeltank, bool klaar, int verwarmTijd)
        {
            this.doeltank = doeltank;
            this.handmatig = handmatig;
            this.aantalVaten = hoeveelheid;
            this.klaar = klaar;
            this.mengtijd = mengtijd;
            this.nummer = nummer;

            this.productcode = productcode;

            this.siroopPercentage = siroopPercentage;

            this.smaak = smaak;

            this.verwarmen = verwarmen;
            this.verwarmTijd = verwarmTijd;
        }

        public Mengbatch(int nummer, bool klaar)
        {
            this.nummer = nummer;
            this.klaar = false;
        }

        #endregion Constructors

        #region Methodes

        public string GenereerProductcode(int ordernummer)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("O");
            sb.Append(ordernummer);
            sb.Append("B");
            sb.Append(nummer.ToString());
            sb.Append("-");
            sb.Append(smaak.Naam[0].ToString());
            sb.Append(aantalVaten.ToString());
            sb.Append(siroopPercentage.ToString());
            productcode = sb.ToString();
            return productcode;
        }

        public void GenereerVulbatchList(List<Doeltank> tankList)
        {
            vulbatchList = new BindingList<Vulbatch>();
            int vatenperdoeltank = 5;
            int count = 0;
            int t = aantalVaten;
            while (t >= 1)
            {
                var doorgeefTank = tankList[0];
                if (t >= vatenperdoeltank)
                {
                    vulbatchList.Add(new Vulbatch(count, nummer, vatenperdoeltank, false, doorgeefTank) { RestVaten = vatenperdoeltank });
                    t -= vatenperdoeltank;
                    count++;
                }
                if (tankList.Count > 1)
                    doorgeefTank = tankList[1];

                if (t < vatenperdoeltank && t >= 1)
                {
                    vulbatchList.Add(new Vulbatch(count, nummer, t, false, doorgeefTank) { RestVaten = t });
                    t -= t;
                }
            }
        }

        #endregion Methodes

        #region NotifyChanged

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        protected bool SetField<T>(ref T field, T value, string propertyName)
        {
            if (EqualityComparer<T>.Default.Equals(field, value)) return false;
            field = value;
            OnPropertyChanged(propertyName);
            return true;
        }

        #endregion NotifyChanged
    }
}